#include "music.h"

Music::Music()
{

}



Music::Music(QUrl url)
    :isLike(false), isHistory(false), musicUrl(url)
{
    // 读取url对应的歌曲文件信息，解析出元数据
    // 歌曲的名称， 歌曲的作者， 歌曲专辑，歌曲持续时长

    musicId = QUuid::createUuid().toString(); //给当前对象设置id去标识唯一性
    parseMediaMetaMusic();
}



void Music::setMusicName(const QString& musicName)
{
    this->musicName = musicName;
}

void Music::setMusicSinger(const QString& musicSinger)
{
    this->musicSinger = musicSinger;
}

void Music::setMusicAlbum(const QString& musicAlbum)
{
    this->musiclbumn = musicAlbum;
}


void Music::setMusicDuration(qint64 duration)
{
    this->duration = duration;
}

void Music::setIsLike(bool isLike)
{
    this->isLike = isLike;
}

void Music::setIsHistory(bool isHistory)
{
    this->isHistory = isHistory;
}


void Music::setMusicQurl(QUrl musicUrl)
{
    this->musicUrl = musicUrl;
}

void Music::setMusicId(const QString &musicId)
{
    this->musicId = musicId;
}


QString Music::getMusicName() const
{
    return musicName;
}

QString Music::getMusicSinger() const
{
    return musicSinger;
}

QString Music::getMusicAlbum()
{
    return musiclbumn;
}


qint64 Music::getMusicDuration() const
{
    return duration;
}

bool Music::getIsLike() const
{
    return isLike;
}


bool Music::getIsHistory() const
{
    return isHistory;
}

QUrl Music::getMusicQurl() const
{
    return musicUrl;
}

QString Music::getMusicId() const
{
    return musicId;
}

QString Music::getLrcFilePath() const
{
    // D:/music/2002年的第一场雪.mp3  歌曲文件的路径
    // D:/music/2002年的第一场雪.lrc  歌词文件

    QString lrcPath =  musicUrl.toLocalFile();
    lrcPath.replace(".mp3", ".lrc");
    lrcPath.replace(".flac", ".lrc");
    lrcPath.replace(".mpga", ".lrc");

    return lrcPath;
}

void Music::InsertMusicDB()
{
    //1，检测music是否在数据库中存在
    QSqlQuery query;
    //如果指定musicId的歌曲在数据库中存在时，返回该musicId记录的所有列的字段
    query.prepare("select id from musicInfo where musicId = ?");

    //在MusicInfo表中查询MusicId等于指定值的歌曲，如果歌曲存在，返回记录中只包含一个1
    query.prepare("select exists (select 1 from MusicInfo where musicId = ?)");
    query.addBindValue(musicId);
    if(!query.exec())
    {
        qDebug() << "查询失败: " << query.lastError().text();
    }

    if(query.next())
    {
        bool isExists = query.value(0).toBool();
        if(isExists)
        {
            query.prepare("update MusicInfo set isLike= ?, isHistory = ? where musicId = ?");
            query.addBindValue(isLike ? 1 : 0);
            query.addBindValue(isHistory ? 1 : 0);
            query.addBindValue(musicId);
            if(!query.exec())
            {
                qDebug() << "更新失败" << query.lastError().text();
                return;
            }

            qDebug() << "更新music信息" << musicName << " " << musicId;
        }
        else
        {
            query.prepare("insert into MusicInfo(musicId, musicName, musicSinger, albumName, musicUrl,duration, isLike, isHistory)\
                          values(?, ?, ?, ?, ?, ?, ?, ?)");
            query.addBindValue(musicId);
            query.addBindValue(musicName);
            query.addBindValue(musicSinger);
            query.addBindValue(musiclbumn);
            query.addBindValue(musicUrl);
            query.addBindValue(duration);
            query.addBindValue(isLike);
            query.addBindValue(isHistory);

            if(!query.exec())
            {
                qDebug() << "插入失败" << query.lastError().text();
                return;
            }
            else
            {
                qDebug() << "插入成功";
            }
        }
    }



    //2,存在,不需要再次插入music对象，只需要将isLike和isHistory属性进行更新
    //3,不存在,直接将music的属性信息插入数据库
}


void Music::parseMediaMetaMusic()
{
    //1，创建媒体播放对象
    QMediaPlayer player;

    //2,设置媒体源，依靠setMedia方法解析元数据
    player.setMedia(musicUrl);

    //3,setMedia不会等待音乐的加载就立马返回,因此在通过meidaMeta方法获取元数据时，需要保证媒体已经添加完毕
    //可以通过isMetaDataAvailable检测数据是否有效，如果该方法返回true，说明加载完成

    while(!player.isMetaDataAvailable())
    {
        QCoreApplication::processEvents(); //
    }

    if(player.isMetaDataAvailable())
    {
        musicName =  player.metaData("Title").toString();
        musicSinger = player.metaData("Author").toString();
        musiclbumn = player.metaData("AlbumTitle").toString();
        duration = player.metaData("Duration").toLongLong();

        QString fileName = musicUrl.fileName(); // 2002年的第一场雪
        //qDebug() << fileName;
        int index = fileName.indexOf('-');
        if(musicName.isEmpty())
        {
            if(index != -1)
            {
                musicName = fileName.mid(0, index).trimmed(); // trimmed()去掉开始和结尾的空格
            }
            else
            {
                musicName = fileName.mid(0, fileName.indexOf('.'));
            }
        }

        //作者为空
        if(musicSinger.isEmpty())
        {
            if(index != -1)
            {
                musicSinger = fileName.mid(index + 1, fileName.indexOf('.') - index - 1).trimmed();
            }
            else
            {
                musicSinger = "未知歌手";
            }
        }

        if(musiclbumn.isEmpty())
        {
            musiclbumn = "未知专辑";
        }

        // 2002年的第一场雪，
        //  qDebug() << musicName << " " << musicSinger <<" " << musiclbumn << " " << duration;
    }
}








